<?php
/**
 * 助手函数
 *
 * @author birdy <freebirdy@foxmail.com>
 * @link http://www.aiyuangong.com
 */

/**
 * 对ID加密
 * @param null|int $length
 * @param null|string $salt
 * @param null|string $alphabet
 * @return Hashids\Hashids static
 */
function hashids($length = null, $salt = null, $alphabet = null)
{
    return \Hashids\Hashids::instance($length, $salt, $alphabet);
}

/**
 * 一键导出Excel 2007格式
 * @param array $header     Excel头部 ["COL1","COL2","COL3",...]
 * @param array $body       和头部长度相等字段查询出的数据就可以直接导出
 * @param null|string $name 文件名，不包含扩展名，为空默认为当前时间
 * @param string|int $version 版本 2007|2003|ods|pdf
 * @return string
 */
function export_excel($header, $body, $name = null, $version = '2007')
{
    return \Excel::export($header, $body, $name, $version);
}

/**
 * 获取七牛上传token
 * @return mixed
 */
function qiniu_token()
{
    return \Qiniu::token();
}

/**
 * 检查指定节点是否有权限
 * @param null $action
 * @param null $controller
 * @param null $module
 * @return bool
 */
function check_access($action = null, $controller = null, $module = null)
{
    return \Rbac::AccessCheck($action, $controller, $module);
}

/**
 * 文件下载
 * @param $file_path
 * @param string $file_name
 * @param string $file_size
 * @param string $ext
 * @return string
 */
function download($file_path, $file_name = '', $file_size = '', $ext = '')
{
    return \File::download($file_path, $file_name, $file_size, $ext);
}

/**
 * ＲＰＣ调用
 * @param type $api   参数格式 模块/控制器/操作
 * @param type $paras 调用参数 必须为数组
 */
function rpc($api = 'index', $paras = [])
{
    $modules = explode("/", $api);
    $api_len = count($modules);
    if ($api_len != 3) {
        return null;
    }
    $rpc = \think\Config::get('rpc') ?: ['open' => false, 'server' => ''];
    if ($rpc['open']) { //jsonRPC方式
        $uri = $rpc['server'];
        if (!is_array($uri)) {
            $uri = [$uri];
        }

        $url = $uri[array_rand($uri)]; //实现负载均衡调用ＲＰＣ接口
        $client = new \jsonRPCClient($url);
        try {
            //$api = str_replace('/', "-_-", $api);
            return call_user_func_array([$client, $api], $paras);
        } catch (Exception $e) {
            throw new \think\Exception($e->getMessage() . " (code: " . $e->getCode() . ")");
        }
    } else {
        //直接模块调用方式
        $cls = $modules[0]."/".$modules[1];
        $model = \think\Loader::model($cls, 'rpc');
        return call_user_func_array([$model, $modules[2]], $paras);
    }
}

/**
 * 显示图片地址
 * @param type $file
 * @param type $thumb  格式如：60,100,360,1280
 * @param type $domain
 * @param type $domain
 * @return type
 */
function img_url($file, $thumb = false, $domain = null, $def ='')
{
    if (!$file) {
        return img_default($thumb);
    }
    
    $file = str_replace("\\", "/", trim($file));
    if (strpos($file, 'http') !== 0) {
        if (strpos($file, '/') === 0) {
            return $file;
        }
        
        //定位图片实际路径
        if (strpos($file, 'uploads/') !== 0) {
            $file = 'uploads/'.$file;
        }
        
        //缩略图
        if ($thumb) {
            //允许生成的缩略图
            $thumbs = config('image_thumb');
            $thumbSize = isset($thumbs[$thumb]) ? $thumbs[$thumb] : [60, 60];
            $img = ROOT_PATH . 'public/'.$file;
            if (is_file($img)) {
                $save_path = dirname($img)."/";
                $savename  = $thumbSize[0]."x".$thumbSize[1]."_".basename($img);
                $save = $save_path.$savename;
                if (!is_file($save)) {
                    try { 
                        $image = \think\Image::open($img);
                        $image->thumb($thumbSize[0], $thumbSize[1])->save($save);
                    } catch (\Exception $ex) { //缩略图生成异常
                        $savename = basename($img);
                    }
                }
                $file = dirname($file).'/'.$savename;
            } else {
                //to do 异常处理
                return img_default($thumb);
            }
        }
        
        if (is_null($domain)) {
            $domain = request()->domain()."/";
        } else {
            $domain = is_string($domain) ? $domain : '/';
        }
        
        return $domain.$file;
    } else {
        return $file;
    }
}

//默认图片
function img_default($size) {
    if (!$size) $size = 360;
    return '/old/data/upload/shop/common/default_goods_image_'.$size.'.gif';
}



/**
 * 重设键，转为array(key=>array())
 * @param array $arr
 * @param string $key
 * @return array
 */
function reset_by_key($arr, $key)
{
    $re = [];
    foreach ($arr as $v) {
        $re[$v[$key]] = $v;
    }

    return $re;
}

/**
 * 按某个key的值分组
 * @param array $arr
 * @param string $key
 * @return array
 */
function group_arr_key($arr, $key)
{
    $re = [];
    foreach ($arr as $v) {
        $re[$v[$key]][] = $v;
    }

    return $re;
}

/**
 * 获取数组内容
 * $array 数组
 * $dime 维度
 * */
function get_arr_vals($array, $dime = 2)
{
    $tmp = '';
    if (isset($array) && !empty($array)) {
        if ($dime === 2) {
            foreach ($array as $key => $val) {
                $tmp .= $val;
            }
        } elseif ($dime === 3) {
            foreach ($array as $key => $val) {
                $tmp .= implode(array_values($val));
            }
        }
    }
    return $tmp;
}

/**
 * 获取二维数据某个键值集合
 * @param array $arr
 * @param string $key
 * @return array
 */
function get_arr_key($arr, $key)
{
    $re = [];
    foreach ($arr as $arr) {
        $re[] = $arr[$key];
    }

    return array_unique($re);
}

/**
 * 节点遍历
 * @param $list
 * @param string $pk
 * @param string $pid
 * @param string $child
 * @param int $root
 * @return array
 */
function list_to_tree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root = 0, $callback = null)
{
    // 创建Tree
    $tree = [];
    if (is_array($list)) {
        // 创建基于主键的数组引用
        $refer = [];
        foreach ($list as $key => $data) {
            $refer[$data[$pk]] =& $list[$key];
        }
        foreach ($list as $key => $data) {
            // 判断是否存在parent
            $parentId = $data[$pid];
            if ($root == $parentId) {
                $tree[] =& $list[$key];
            } else {
                if (isset($refer[$parentId])) {
                    $parent =& $refer[$parentId];
                    is_callable($callback) && $callback($list[$key]);
                    $parent[$child][] =& $list[$key];
                }
            }
        }
    }

    return $tree;
}